$(function(){
    jQuery.validator.addMethod("stringCheck", function(value, element) {
        return this.optional(element) || /^[u0391-uFFE5w]+$/.test(value);
    }, "只能包括中文字、英文字母、数字和下划线");
// 中文字两个字节
    jQuery.validator.addMethod("byteRangeLength", function(value, element, param) {
        var length = value.length;
        for(var i = 0; i < value.length; i++){
            if(value.charCodeAt(i) > 127){
                length++;
            }
        }
        return this.optional(element) || ( length >= param[0]&&length<= param[1] );
    }, "请确保输入的值在3-15个字节之间(一个中文字算2个字节)");

// 身份证号码验证
    jQuery.validator.addMethod("isIdCardNo", function(value, element) {
        return this.optional(element) || isIdCardNo(value);
    }, "身份证号码有误");
    //护照编号验证
    jQuery.validator.addMethod("passport", function(value, element) {
        return this.optional(element) || checkPassport(value);
    }, "护照编号有误");
// 手机号码验证
    jQuery.validator.addMethod("isMobile", function(value, element) {
        var length = value.length;
        var rule = /^(((13[0-9]{1})|(14[0-9]{1})|(15[0-9]{1})|(17[0-9]{1})|(18[0-9]{1}))+\d{8})$/;
        return this.optional(element) || (length == 11 && rule.test(value));
    }, "请正确填写您的手机号码");
// 电话号码验证
    jQuery.validator.addMethod("isTel", function(value, element) {
        var tel = /^d{3,4}-?d{7,9}$/; //电话号码格式010-12345678
        return this.optional(element) || (tel.test(value));
    }, "请正确填写您的电话号码");
// 联系电话(手机/电话皆可)验证
    jQuery.validator.addMethod("isPhone", function(value,element) {
        var length = value.length;
        var mobile = /^1[34578]\d{9}$/;
        var tel = /^0\d{2,3}-\d{5,9}|0\d{2,3}-\d{5,9}$/;
        return this.optional(element) || (tel.test(value) || mobile.test(value));

    }, "请正确填写您的联系电话");

// 邮政编码验证
    jQuery.validator.addMethod("isZipCode", function(value, element) {
        var tel = /^[0-9]{6}$/;
        return this.optional(element) || (tel.test(value));
    }, "请正确填写您的邮政编码");
// 邮政编码验证
    jQuery.validator.addMethod("zipcode", function(value, element) {
        var tel = /^[0-9]{6}$/;
        return this.optional(element) || (tel.test(value));
    }, "请正确填写邮政编码");

    function isIdCardNo(num) {
        var factorArr = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);
        var parityBit=new Array("1","0","X","9","8","7","6","5","4","3","2");
        var varArray = new Array();
        var lngProduct = 0;
        var intCheckDigit;
        var intStrLen = num.length;
        var idNumber = num;
        if (intStrLen != 18) {
            return false;
        }

        for(var i=0;i<intStrLen;i++) {
            varArray[i] = idNumber.charAt(i);
            if ((varArray[i] < '0' || varArray[i] > '9') && (i != 17)) {
                return false;
            } else if (i < 17) {
                varArray[i] = varArray[i] * factorArr[i];
            }
        }
        var date8 = idNumber.substring(6,14);
        if (isDate8(date8) == false) {
            return false;
        }

        for(i=0;i<17;i++) {
            lngProduct = lngProduct + varArray[i];
        }

        intCheckDigit = parityBit[lngProduct % 11];

        if (varArray[17] != intCheckDigit) {
            return false;
        }

        return true;
    }


    function isDate6(sDate) {
        if(!/^[0-9]{6}$/.test(sDate)) {
            return false;
        }
        var year, month, day;
        year = sDate.substring(0, 4);
        month = sDate.substring(4, 6);
        if (year < 1700 || year > 2500) return false
        if (month < 1 || month > 12) return false
        return true
    }

    function isDate8(sDate) {
        if(!/^[0-9]{8}$/.test(sDate)) {
            return false;
        }
        var year, month, day;
        year = sDate.substring(0, 4);
        month = sDate.substring(4, 6);
        day = sDate.substring(6, 8);
        var iaMonthDays = [31,28,31,30,31,30,31,31,30,31,30,31]
        if (year < 1700 || year > 2500) return false
        if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) iaMonthDays[1]=29;
        if (month < 1 || month > 12) return false
        if (day < 1 || day > iaMonthDays[month - 1]) return false
        return true
    }


//字母数字
    jQuery.validator.addMethod("alnum", function(value, element) {
        return this.optional(element) || /^[a-zA-Z0-9]+$/.test(value);
    }, "只能包括英文字母和数字");



// 汉字
    jQuery.validator.addMethod("chCharacter", function(value, element) {
        var tel = /^[u4e00-u9fa5]+$/;
        return this.optional(element) || (tel.test(value));
    }, "请输入汉字");

// 字符最小长度验证（一个中文字符长度为2）
    jQuery.validator.addMethod("stringMinLength", function(value, element, param) {
        var length = value.length;
        for ( var i = 0; i < value.length; i++) {
            if (value.charCodeAt(i) > 127) {
                length++;
            }
        }
        return this.optional(element) || (length >= param);
    }, $.validator.format("长度不能小于{0}!"));

// 字符最大长度验证（一个中文字符长度为2）
    jQuery.validator.addMethod("stringMaxLength", function(value, element, param) {
        var length = value.length;
        for ( var i = 0; i < value.length; i++) {
            if (value.charCodeAt(i) > 127) {
                length++;
            }
        }
        return this.optional(element) || (length <= param);
    }, $.validator.format("长度不能大于{0}!"));

// 字符验证
    jQuery.validator.addMethod("string", function(value, element) {
        return this.optional(element) || /^[u0391-uFFE5w]+$/.test(value);
    }, "不允许包含特殊符号!");

// 必须以特定字符串开头验证
    jQuery.validator.addMethod("begin", function(value, element, param) {
        var begin = new RegExp("^" + param);
        return this.optional(element) || (begin.test(value));
    }, $.validator.format("必须以 {0} 开头!"));

// 验证两次输入值是否不相同
    jQuery.validator.addMethod("notEqualTo", function(value, element, param) {
        return value != $(param).val();
    }, $.validator.format("两次输入不能相同!"));

// 验证值不允许与特定值等于
    jQuery.validator.addMethod("notEqual", function(value, element, param) {
        return value != param;
    }, $.validator.format("输入值不允许为{0}!"));

// 验证值必须大于特定值(不能等于)
    jQuery.validator.addMethod("gt", function(value, element, param) {
        return value > param;
    }, $.validator.format("输入值必须大于{0}!"));

    function isEmpty(v, allowBlank) {
        return v === null || v === undefined || (!allowBlank ? v === "" : false);
    }
    //验证护照是否正确
    function checkPassport(number){
        var str=number;
        //在JavaScript中，正则表达式只能使用"/"开头和结束，不能使用双引号
        var Expression=/(P\d{7})|(G\d{8})/;
        var objExp=new RegExp(Expression);
        if(objExp.test(str)==true){
            return true;
        }else{
            return false;
        }
    }
    //验证港澳通行证
    function isHkongMacao(value) {
        var a = /\S{9,12}/;
        return a.test(value);
    }
    //验证台胞证
    function isTaiw(value) {
        var d = /\d{8,11}/;
        return d.test(value);
    }
    var join_msg = "";
    jQuery.validator.addMethod("checkCard",function(value,element,type){
            var new_type = type[0].value;
            if(new_type == 1){
                join_msg = "身份证号码格式有误";
                var CN = isIdCardNo(value);
                return this.optional(element) || CN;
            }else if(new_type == 2){
                join_msg="只能输入英文字母和数字";
                return this.optional(element) || /^[a-zA-Z0-9]+$/.test(value);
            }else if(new_type == 3){
                join_msg = "港澳居民通行证、台胞证格式有误";
                var KM = isHkongMacao(value);
                var TW = isTaiw(value);
                return this.optional(element) || KM || TW;
            } else if(new_type == 4){
                join_msg="只能输入英文字母和数字";
                return this.optional(element) || /^[a-zA-Z0-9]+$/.test(value);
            }
        },function(){
            return join_msg;
        }
    );
    //自定义validate验证输入的数字小数点位数不能大于两位
    jQuery.validator.addMethod("minNumber",function(value, element){
        var returnVal = true;
        var inputZ=value;
        var ArrMen= inputZ.split(".");    //截取字符串
        if(ArrMen.length==2){
            if(ArrMen[1].length>2){    //判断小数点后面的字符串长度
                returnVal = false;
                return false;
            }
        }
        return returnVal;
    },"小数点后最多为两位");         //验证错误信息


});

